package com.itheima.leetcode.od.b.string;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.stream.Collectors;

/**
 * (B卷,100分)- 分班（Java & JS & Python）
 * <p>
 * 题目描述
 * <p>
 * 幼儿园两个班的小朋友在排队时混在了一起，每位小朋友都知道自己是否与前面一位小朋友同班，请你帮忙把同班的小朋友找出来。
 * <p>
 * 小朋友的编号是整数，与前一位小朋友同班用Y表示，不同班用N表示。
 * <p>
 * 输入描述
 * <p>
 * 输入为空格分开的小朋友编号和是否同班标志。
 * <p>
 * 比如：6/N 2/Y 3/N 4/Y，表示4位小朋友，2和6同班，3和2不同班，4和3同班。
 * <p>
 * 其中，小朋友总数不超过999，每个小朋友编号大于0，小于等于999。
 * <p>
 * 不考虑输入格式错误问题。
 * <p>
 * 输出描述
 * <p>
 * 输出为两行，每一行记录一个班小朋友的编号，编号用空格分开，且：
 * <p>
 * 编号需按照大小升序排列，分班记录中第一个编号小的排在第一行。
 * 若只有一个班的小朋友，第二行为空行。
 * 若输入不符合要求，则直接输出字符串ERROR。
 * <p>
 * 用例
 * <p>
 * 输入	1/N 2/Y 3/N 4/Y
 * 输出
 * 1 2
 * 3 4
 * <p>
 * 说明	2的同班标记为Y，因此和1同班。
 * 3的同班标记为N，因此和1、2不同班。
 * 4的同班标记为Y，因此和3同班。
 * 所以1、2同班，3、4同班，输出为
 * 1 2
 * 3 4
 * <p>
 * 输入	1/N 2/Y 3/N 4/Y 5/Y
 * 输出
 * 1 2
 * 3 4 5
 * <p>
 * 说明	无
 * <p>
 * 题目解析
 * <p>
 * 本题应该只是逻辑分析题。
 * <p>
 * 我的解题思路如下：
 * <p>
 * 定义一个标志preBelongToOne，记录前一个小朋友是否属于一班，初始时为false，表示不属于一班。
 * <p>
 * 然后遍历排队的小朋友，被遍历的小朋友为kid，然后kid的标志如果是Y，则表示和前面一个小朋友同班，否则不同班。我们定义一个标志 isSameWithPre，来记录当前kid是否和前面一个小朋友同班。
 * <p>
 * 如果 preBelongToOne == true，则前一个小朋友属于一班：
 * 若 isSameWithPre == true，则当前小朋友也属于一班
 * 若 isSameWithPre == false，则当前小朋友属于二班，同时当前小朋友变为新的前一个小朋友，即需要更新preBelongToOne = false
 * 如果 preBelongToOne == false，则前一个小朋友属于二班：
 * 若 isSameWithPre == true，则当前小朋友也属于二班
 * 若 isSameWithPre == false，则当前小朋友属于一班，同时当前小朋友变为新的前一个小朋友，即需要更新preBelongToOne = true
 * 之后就是关注题目的校验要求和打印要求。
 * <p>
 * 关于校验要求，如果不符合下面要求，打印“None”：
 * <p>
 * 小朋友总数不超过999
 * 999 >= 小朋友编号 > 0
 * 关于打印要求：
 * <p>
 * 一班、二班需要各自升序，且比较第一个小朋友编号小的，则首先打印
 * 如果二班没有小朋友，则打印空行
 */
public class ClassDivision {
    public static void main(String[] args) {
        /*Scanner sc = new Scanner(System.in);
        getResult(sc.nextLine());*/

        getResult("1/N 2/Y 3/N 4/Y");
    }

    public static void getResult(String str) {
        String[][] kids = Arrays.stream(str.split(" ")).map(s -> s.split("/")).toArray(String[][]::new);

        ArrayList<Integer> one = new ArrayList<>();
        ArrayList<Integer> two = new ArrayList<>();

        boolean preBelongToOne = false;

        for (String[] kid : kids) {
            int id = Integer.parseInt(kid[0]);

            boolean isSameWithPre = "Y".equals(kid[1]);

            if (preBelongToOne) {
                if (isSameWithPre) {
                    one.add(id);
                } else {
                    two.add(id);
                    preBelongToOne = false;
                }
            } else {
                if (isSameWithPre) {
                    two.add(id);
                } else {
                    one.add(id);
                    preBelongToOne = true;
                }
            }
        }

        // 编号需按照大小升序排列
        String oneStr = one.stream().sorted((a, b) -> a - b).map(String::valueOf).collect(Collectors.joining(" "));

        // 若只有一个班的小朋友，第二行为空行。
        if (two.size() == 0) {
            System.out.println(oneStr);
            System.out.println("");
            return;
        }

        // 编号需按照大小升序排列
        String twoStr = two.stream().sorted((a, b) -> a - b).map(String::valueOf).collect(Collectors.joining(" "));

        // 分班记录中第一个编号小的排在第一行
        if (one.get(0) < two.get(0)) {
            System.out.println(oneStr);
            System.out.println(twoStr);
        } else {
            System.out.println(twoStr);
            System.out.println(oneStr);
        }
    }
}